"""
CORS问题解决方案 - 针对Python Flask服务器

使用方法:
1. 将此文件添加到您的Flask项目中
2. 在您的主应用文件中导入并使用 setup_cors 函数

示例:
```python
from flask import Flask
from server_cors_fix import setup_cors

app = Flask(__name__)
setup_cors(app)  # 添加此行以启用CORS

# 然后定义您的路由...
```
"""

from flask import request, make_response

def setup_cors(app, allowed_origins=None):
    """
    为Flask应用程序设置CORS支持
    
    参数:
    - app: Flask应用实例
    - allowed_origins: 允许的源列表，如果为None，将从请求的Origin头获取
    """
    
    @app.after_request
    def add_cors_headers(response):
        origin = request.headers.get('Origin')
        
        # 如果提供了允许的源列表，检查当前源是否在列表中
        if allowed_origins:
            if origin in allowed_origins:
                response.headers.add('Access-Control-Allow-Origin', origin)
        # 否则根据请求动态设置
        elif origin:
            response.headers.add('Access-Control-Allow-Origin', origin)
        else:
            response.headers.add('Access-Control-Allow-Origin', '*')
        
        # 允许凭证
        response.headers.add('Access-Control-Allow-Credentials', 'true')
        
        # 允许的方法和头部
        response.headers.add('Access-Control-Allow-Methods', 
                            'GET, POST, PUT, DELETE, OPTIONS')
        response.headers.add('Access-Control-Allow-Headers', 
                            'Content-Type, Authorization, X-Requested-With')
        
        # 预检请求的缓存时间（秒）
        response.headers.add('Access-Control-Max-Age', '3600')
        
        return response
    
    # 专门处理OPTIONS预检请求的路由
    @app.route('/', defaults={'path': ''}, methods=['OPTIONS'])
    @app.route('/<path:path>', methods=['OPTIONS'])
    def handle_options(path):
        return make_response('', 200)
    
    print("✅ CORS配置已应用 - 自动处理跨域请求")


def setup_flask_cors_extension(app, frontend_url=None):
    """
    使用flask-cors扩展设置CORS
    
    参数:
    - app: Flask应用实例
    - frontend_url: 前端URL，如果为None，允许所有源
    
    注意: 需要先安装flask-cors: pip install flask-cors
    """
    try:
        from flask_cors import CORS
        
        resources = {r"/*": {}}
        
        if frontend_url:
            # 对于使用凭据的请求，必须指定确切的源
            resources[r"/*"] = {
                "origins": frontend_url,
                "supports_credentials": True,
                "allow_headers": ["Content-Type", "Authorization", "X-Requested-With"],
                "methods": ["GET", "POST", "PUT", "DELETE", "OPTIONS"]
            }
        else:
            # 允许所有源，但如果使用凭据就会有问题
            resources[r"/*"] = {
                "origins": "*"
            }
            print("⚠️ 警告: 使用通配符'*'作为源可能会在使用凭据时导致CORS问题")
            
        CORS(app, resources=resources)
        print(f"✅ flask-cors扩展配置已应用 - 源:{frontend_url if frontend_url else '*'}")
        
    except ImportError:
        print("❌ 无法导入flask-cors。请运行: pip install flask-cors")
        
        # 退回到手动CORS配置
        setup_cors(app)
        
        
# 示例用法和测试代码
if __name__ == "__main__":
    from flask import Flask, jsonify
    
    app = Flask(__name__)
    
    # 使用手动CORS配置
    setup_cors(app)
    
    # 或者使用flask-cors扩展
    # setup_flask_cors_extension(app, frontend_url="http://localhost:5500")
    
    @app.route('/test', methods=['GET', 'POST'])
    def test():
        return jsonify({
            "message": "CORS测试成功",
            "origin": request.headers.get('Origin', '未知'),
            "method": request.method
        })
    
    # 模拟用户注册接口
    @app.route('/user/register', methods=['POST'])
    def register():
        try:
            data = request.json
            # 简单的验证
            if not data or not data.get('username') or not data.get('password'):
                return jsonify({
                    "code": 1,
                    "message": "用户名和密码不能为空"
                })
                
            # 这里应该有实际的用户注册逻辑
            # ...
            
            return jsonify({
                "code": 0,
                "message": "注册成功",
                "data": {
                    "username": data.get('username')
                }
            })
        except Exception as e:
            return jsonify({
                "code": 1,
                "message": f"注册失败: {str(e)}"
            })
    
    # 测试服务器
    print("启动CORS测试服务器在 http://127.0.0.1:5000")
    app.run(debug=True) 